/*
 * ArbolBinario.cpp
 *
 *  Created on: 14/10/2011
 *      Author: diego
 */

#include "ArbolBinario.h"

ArbolBinario::ArbolBinario() {
	this->raiz = NULL;
	this->cant_nodos = 0;
}


bool ArbolBinario::esIgual(NodoABB* nodo1, NodoABB* nodo2){
	return nodo1->getTermino() == nodo2->getTermino();
}

bool ArbolBinario::esIgual(NodoABB* nodo, string* termino){
	if (nodo != NULL){
		return (nodo->getTermino()->compare(termino->c_str()) == 0);
	}

	return false;
}

void ArbolBinario::agregarTermino(string* termino, int doc_id, MonitorMemoria* mem){
	if (this->raiz == NULL){
		this->raiz = new NodoABB(termino, doc_id);
		mem->incrementarNodoArbol();
		mem->incrementarNodoLista();
		return;
	}


	NodoABB* nodoActual = this->raiz;
	NodoABB* nodoAnterior = this->raiz;

	while(nodoActual != NULL && !this->esIgual(nodoActual, termino)){
		nodoAnterior = nodoActual;
		nodoActual = this->getProximo(nodoActual, termino);
	}

	if (nodoActual == NULL){
		NodoABB* nodo = new NodoABB(termino, doc_id);

		mem->incrementarNodoArbol();
		mem->incrementarNodoLista();

		if (termino->compare(nodoAnterior->getTermino()->c_str()) < 0){
			// termino es menor que el termino del nodo
			nodoAnterior->setHijoIzq(nodo);
		}else{
			// termino es mayor que el termino del nodo
			nodoAnterior->setHijoDer(nodo);
		}

		this->cant_nodos++;

	}else{
		nodoActual->incrementarFrecuencias(doc_id, mem);
		delete termino;
	}

}

NodoABB* ArbolBinario::getProximo(NodoABB* nodo, string* termino){
	// supongo que termino es distinto del termino del nodo
	if (termino->compare(nodo->getTermino()->c_str()) < 0){
		// termino es menor que el termino del nodo
		return nodo->getHijoIzq();
	}else{
		// termino es mayor que el termino del nodo
		return nodo->getHijoDer();
	}
}

int ArbolBinario::getCantNodos(){
	return this->cant_nodos;
}

NodoABB* ArbolBinario::getRaiz(){
	return this->raiz;
}

void ArbolBinario::borrar(){
	if (this->raiz != NULL){
		delete this->raiz;
	}
	this->raiz = NULL;
	this->cant_nodos = 0;
	return;
}

ArbolBinario::~ArbolBinario() {
	if (this->raiz != NULL){
		delete this->raiz;
	}
}

